using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public EmpresaVO getEmpresa(int? idEmpresa, string empresa)
		{
			EmpresaVO empresaVO = null;
			List<EmpresaVO> listEmpresaVOs = getEmpresas(idEmpresa, empresa);
			if (listEmpresaVOs != null && listEmpresaVOs.Count > 0)
			{
				empresaVO = listEmpresaVOs[0];
			}
			return empresaVO;
		}

		public EmpresaVO getEmpresa(int? idEmpresa)
		{
			return getEmpresa(idEmpresa, null);
		}

		public List<EmpresaVO> getEmpresas()
		{
			return getEmpresas(null, null);
		}

		public List<EmpresaVO> getEmpresas(int? idEmpresa)
		{
			return getEmpresas(idEmpresa, null);
		}

		public List<EmpresaVO> getEmpresas(int? idEmpresa, string empresa)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT emp.idEmpresa as emp_idEmpresa, emp.empresa as emp_empresa, emp.Cadastro as emp_Cadastro, emp.CadastradoPor as emp_CadastradoPor, emp.Edicao as emp_Edicao, emp.EditadoPor as emp_EditadoPor  ");
			query.AppendLine("FROM empresa as emp ");
			if (idEmpresa != null)
			{
				query.AppendLine(where + "emp.idEmpresa=@idEmpresa ");
				where = "AND ";
			}
			if (empresa != null)
			{
				query.AppendLine(where + "emp.empresa LIKE @empresa ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY emp.empresa ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idEmpresa!= null) cmd.Parameters.Add(getParameter(cmd, "@idEmpresa", idEmpresa));
			if (empresa!= null) cmd.Parameters.Add(getParameter(cmd, "@empresa", "%"+empresa+"%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<EmpresaVO> listEmpresa = new List<EmpresaVO>();

				while (reader.Read())
				{
					EmpresaVO empresaVO = EmpresaVO.CreateVO();
					empresaVO.idEmpresa = reader.GetInt32(reader.GetOrdinal("emp_idEmpresa"));
					empresaVO.empresa = reader.GetString(reader.GetOrdinal("emp_empresa"));
					empresaVO.cadastro = reader.GetDateTime(reader.GetOrdinal("emp_Cadastro"));
					empresaVO.cadastradoPor = reader.GetString(reader.GetOrdinal("emp_CadastradoPor"));
					empresaVO.edicao = reader.GetDateTime(reader.GetOrdinal("emp_Edicao"));
					empresaVO.editadoPor = reader.GetString(reader.GetOrdinal("emp_EditadoPor"));


					listEmpresa.Add(empresaVO);
				}
				reader.Close();
				return listEmpresa;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setEmpresa(EmpresaVO empresaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE empresa ");
			query.AppendLine("SET empresa=@empresa,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idEmpresa=@idEmpresa ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idEmpresa", empresaVO.idEmpresa));
			cmd.Parameters.Add(getParameter(cmd, "@empresa", empresaVO.empresa));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", empresaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", empresaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", empresaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", empresaVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newEmpresa(EmpresaVO empresaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO empresa ");
			query.AppendLine("  ( empresa, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @empresa, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@empresa", empresaVO.empresa));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", empresaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", empresaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", empresaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", empresaVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('empresa') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delEmpresa(EmpresaVO empresaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM empresa ");
			query.AppendLine("WHERE idEmpresa=@idEmpresa ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idEmpresa", empresaVO.idEmpresa));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
	}
}
